Verilog的时间系统任务

您所在的位置:网站首页 in time 与on time Verilog的时间系统任务

Verilog的时间系统任务

2023-08-11 15:35| 来源: 网络整理| 查看: 265

文章目录

        概述

        $time

        $stime

        $realtime

        总结与参考

概述

        在做仿真的时候,常常需要获取仿真时间以便了解被测模块的测试情况。Verilog语法提供了3个系统任务----$time、$stime、$realtime,这3个系统任务都可以在仿真时(无法综合)获取当前仿真时刻的时间值,但其使用也有一点小小的区别。

$time

        调用系统任务$time,将会获得一个64位的integer型变量,其表示调用该系统任务时的仿真时间。需要注意的是,其值会自动缩放到`timescale任务所定义的时间单位。下面举个例子:

`timescale 10 ns / 1 ns module tb_time_test; reg set; parameter p = 1.55; initial begin $monitor($time,,"set=",set); #p set = 0; #p set = 1; end endmodule

        仿真结果如下: 

在上面的例子中,将仿真时间单位定义成了10ns,而时间精度则定义为1ns。第1行,set未赋值,所以输出 set = x,此时时间为0第2行,set赋值为0,所以输出 set = 0,此时时间为1.55*10=15.5ns,由于精度为1ns,所以四舍五入到16ns,同时由于时间单位为10ns,所以不能表示16ns,而是表示四舍五入后的2(单位10ns)第3行,set赋值为1,所以输出 set = 1,此时时间为16+1.55*10=31.5ns,由于精度为1ns,所以四舍五入到32ns,同时由于时间单位为10ns,所以不能表示32ns,而是表示四舍五入后的3(单位10ns)

        接下来我们把上述代码的仿真时间单位改为1ns,时间精度保留为1ns,这样看起来会好理解一些。

`timescale 1 ns / 1 ns module tb_time_test; reg set; parameter p = 1.55; initial begin $monitor($time,,"set=",set); #p set = 0; #p set = 1; end endmodule

        仿真结果如下:

在上面的例子中,将仿真时间单位定义成了1ns,而时间精度则定义为1ns。第1行,set未赋值,所以输出 set = x,此时时间为0第2行,set赋值为0,所以输出 set = 0,此时时间为1.55*1=1.55ns,由于精度为1ns,所以四舍五入到2ns,时间单位为1ns,所以直接显示2(单位1ns)第3行,set赋值为1,所以输出 set = 1,此时时间为2+1.55*1=3.55ns,由于精度为1ns,所以四舍五入到4ns,时间单位为1ns,所以直接显示4(单位1ns) $stime

        调用系统任务$stime,将会获得一个32位的无符号integer型变量,其表示调用该系统任务时的仿真时间。需要注意的是,其值同样会自动缩放到`timescale任务所定义的时间单位。

        这个系统任务的用法基本上和 $time是一样的,只不过由于其只有32位,所以表示的时间范围会比较小,使用的时候注意别溢出了。

$realtime

        调用系统任务$realtime,将会获得一个real型变量,其表示调用该系统任务时的仿真时间。需要注意的是,其值会自动缩放到`timescale任务所定义的时间单位。

        由于其返回值为实数real型,所以其可以表示小数时间。同样以上面的代码为例:

`timescale 10 ns / 1 ns module tb_time_test; reg set; parameter p = 1.55; initial begin $monitor($realtime,,"set=",set); #p set = 0; #p set = 1; end endmodule

        仿真结果如下:

在上面的例子中,将仿真时间单位定义成了10ns,而时间精度则定义为1ns。第1行,set未赋值,所以输出 set = x,此时时间为0第2行,set赋值为0,所以输出 set = 0,此时时间为1.55*10=15.5ns,由于精度为1ns,所以四舍五入到16ns,同时由于时间单位为10ns,所以不能表示16ns,而是表示1.6(可以表示小数了,单位10ns)第3行,set赋值为1,所以输出 set = 1,此时时间为16+1.55*10=31.5ns,由于精度为1ns,所以四舍五入到32ns,同时由于时间单位为10ns,所以不能表示32ns,而是表示3.2(可以表示小数了,单位10ns) 总结与参考 $time、$stime、$realtime这三个系统任务都可以获取当前仿真时间,区别在于返回的时间值的类型不同,一般的应用使用$time即可在仿真时获取仿真时间可以观察、监测被测模块的测试情况,有利于提高测试效率

        参考资料1:IEEE Standard for Verilog® Hardware Description Language(IEEE Std 1364™-2005)

📣博客主页:wuzhikai.blog.csdn.net📣本文由 孤独的单刀 原创,首发于CSDN平台🐵📣您有任何问题,都可以在评论区和我交流📞!📣创作不易,您的支持是我持续更新的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3